﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BLL;
using BE;
using VentaPorCatalogos.Models;
using System.Text;
using BLL.Exceptions;
using BE.SearchCriteria;

namespace VentaPorCatalogos.Pages
{
    public partial class Divisiones : VentaPorCatalogos.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DivisionesModel oDivisionesModel = new DivisionesModel();
                SetModel<DivisionesModel>(oDivisionesModel);
                CargarDivisiones();
                SetFormBehaviour(behavior.Initial);
                divVendedor.Visible = false;
            }
        }

        protected void Page_PreRender(object sender, EventArgs e)
        {
            ConfigurarFormBehaviour();
        }

        private void ConfigurarFormBehaviour()
        {
            behavior wComportamiento;
            wComportamiento = GetFormBehaviour();
            switch (wComportamiento)
            {
                case behavior.Initial:                    
                    break;

                case behavior.New:                    
                    break;

                case behavior.Edit:                    
                    break;

                case behavior.View:
                    break;
            }
        }
        
        private void CargarDivisiones()
        {
            List<DivisionBE> oDivisionesBE = DivisionBLL.SeleccionarTodos();

            DivisionNode oDivisionNode = new DivisionNode(oDivisionesBE);

            tvDivisiones.Nodes.Clear();
            tvDivisiones.Nodes.Add(oDivisionNode);

            tvDivisiones.Nodes[0].Expand();
        }

        protected void btnSelVendedor_Click(object sender, ImageClickEventArgs e)
        {
            int wCount = 0;

            if (txtVendedor.Text.Trim().Length > 0)
            {
                VendedorSC wFiltroSC = new VendedorSC();
                wFiltroSC.Apellido = txtVendedor.Text;
                List<VendedorBE> wListResultado = VendedorBLL.SeleccionarTodos(wFiltroSC, 0, null, ref wCount);
                if (wListResultado != null && wListResultado.Count > 0)
                {
                    if (wListResultado.Count == 1)
                    {
                        hidIdVendedor.Value = wListResultado[0].IdVendedor.ToString();
                        txtVendedor.Text = wListResultado[0].ApellidoNombre.ToString();                        
                    }
                    else
                        EjecutarScript(string.Format("SeleccionarVendedor(\"{0}\");", txtVendedor.Text));
                }
                else
                {
                    txtVendedor.Text = string.Empty;
                    EjecutarScript("alert(\"Sin resultados para el filtro especificado.\");");
                }
            }
            else
            {
                EjecutarScript(string.Format("SeleccionarVendedor(\"{0}\");", txtVendedor.Text));
            }

        }

        protected void tvDivisiones_SelectedNodeChanged(object sender, EventArgs e)
        {
            DivisionNode oNode = (DivisionNode)tvDivisiones.SelectedNode;

            switch ((oNode).TipoNodo)
            {
                case TipoNodo.Raiz:
                    btnNuevo.Visible = true;
                    btnNuevo.Enabled = true;
                    btnNuevo.Text = "Crear División";
                    txtDescripcion.Text = string.Empty;
                    divVendedor.Visible = false;
                    hidIdVendedor.Value = string.Empty;
                    txtVendedor.Text = string.Empty;
                    SetFormBehaviour(behavior.Initial);
                    break;

                case TipoNodo.Division:
                    btnNuevo.Visible = true;
                    btnNuevo.Enabled = true;
                    btnNuevo.Text = "Crear Zona";
                    DivisionBE oDivisionBE = oNode.GetElemento<DivisionBE>();
                    txtDescripcion.Text = oDivisionBE.Descripcion;
                    divVendedor.Visible = false;
                    hidIdVendedor.Value = string.Empty;
                    txtVendedor.Text = string.Empty;
                    SetFormBehaviour(behavior.View);
                    break;

                case TipoNodo.Zona:
                    btnNuevo.Visible = true;
                    btnNuevo.Enabled = true;
                    btnNuevo.Text = "Crear Area";
                    ZonasBE oZonaBE = oNode.GetElemento<ZonasBE>();
                    txtDescripcion.Text = oZonaBE.Descripcion;
                    hidIdVendedor.Value = oZonaBE.IdVendedorGteZonal.ToString();
                    txtVendedor.Text = oZonaBE.GerenteZonal;
                    divVendedor.Visible = true;
                    SetFormBehaviour(behavior.View);
                    break;

                case TipoNodo.Area:
                    btnNuevo.Visible = false;
                    btnNuevo.Enabled = false;
                    AreaBE oAreaBE = oNode.GetElemento<AreaBE>();
                    txtDescripcion.Text = oAreaBE.Descripcion;
                    hidIdVendedor.Value = string.Empty;
                    txtVendedor.Text = string.Empty;
                    divVendedor.Visible = false;
                    SetFormBehaviour(behavior.View);
                    break;
            }
            lblRuta.Text = MostrarRuta(oNode);
            txtDescripcion.Enabled = false;
            txtVendedor.Enabled = false;
            btnSelVendedor.Enabled = false;
            btnEditar.Enabled = true;
            btnEliminar.Enabled = true;
            btnGuardar.Enabled = false;
            btnCancelarGuardar.Enabled = false;
            
        }

        private string MostrarRuta(DivisionNode oNode)
        {
            StringBuilder sbRuta = new StringBuilder();
            switch (oNode.TipoNodo)
            {
                case TipoNodo.Raiz:
                    sbRuta.Insert(0, "Divisiones");
                    break;
                case TipoNodo.Division:
                    sbRuta.Insert(0, (oNode.Elemento as DivisionBE).Descripcion);
                    sbRuta.Insert(0, string.Format("{0} / ", MostrarRuta(oNode.Parent as DivisionNode)));
                    break;
                case TipoNodo.Zona:
                    sbRuta.Insert(0, (oNode.Elemento as ZonasBE).Descripcion);
                    sbRuta.Insert(0, string.Format("{0} / ", MostrarRuta(oNode.Parent as DivisionNode)));
                    break;
                case TipoNodo.Area:
                    sbRuta.Insert(0, (oNode.Elemento as AreaBE).Descripcion);
                    sbRuta.Insert(0, string.Format("{0} / ", MostrarRuta(oNode.Parent as DivisionNode)));
                    break;
            }
            
            return sbRuta.ToString();
        }

        protected void tvDivisiones_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            int wValor = 0;
            switch ((e.Node as DivisionNode).TipoNodo)
            {
                case TipoNodo.Division:
                    if (int.TryParse(e.Node.Value, out wValor) && wValor > 0)
                    {
                        List<ZonasBE> oZonasBE = DivisionBLL.SeleccionarZonasPorDivision(int.Parse(e.Node.Value));
                        (e.Node as DivisionNode).GetElemento<DivisionBE>().Zonas = oZonasBE;
                        (e.Node as DivisionNode).PopulateNodes();
                    }
                    break;

                case TipoNodo.Zona:
                    if (int.TryParse(e.Node.Value, out wValor) && wValor > 0)
                    {
                        List<AreaBE> oAreasBE = DivisionBLL.SeleccionarAreasPorZona(int.Parse(e.Node.Value));
                        (e.Node as DivisionNode).GetElemento<ZonasBE>().Areas = oAreasBE;
                        (e.Node as DivisionNode).PopulateNodes();
                    }
                    break;
            }
        }

 

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            DivisionNode oNode = (DivisionNode)tvDivisiones.SelectedNode;

            int wId;
            int? wIdVendedor = null;
            if (int.TryParse(hidIdVendedor.Value, out wId))
            {
                wIdVendedor = wId;
            }

            switch (oNode.TipoNodo)
            {
                case TipoNodo.Zona:
                    if (GetFormBehaviour() == behavior.Edit)                    
                        oNode.EditarNodo(txtDescripcion.Text, wIdVendedor, txtVendedor.Text);                    
                    else
                        if (GetFormBehaviour() == behavior.New)                        
                            oNode.AgregarNodo(txtDescripcion.Text, null, null);                        
                    break;
                case TipoNodo.Raiz:
                    if (GetFormBehaviour() == behavior.Edit)
                        oNode.EditarNodo(txtDescripcion.Text, null, null);
                    else
                        if (GetFormBehaviour() == behavior.New)                        
                            oNode.AgregarNodo(txtDescripcion.Text, null, null);                        
                    break;
                case TipoNodo.Division:
                    if (GetFormBehaviour() == behavior.Edit)                    
                        oNode.EditarNodo(txtDescripcion.Text, null, null);                    
                    else
                        if (GetFormBehaviour() == behavior.New)                        
                            oNode.AgregarNodo(txtDescripcion.Text, wIdVendedor, txtVendedor.Text);                        
                    break;
                case TipoNodo.Area:
                    if (GetFormBehaviour() == behavior.Edit)
                        oNode.EditarNodo(txtDescripcion.Text, null, null);
                    else
                        if (GetFormBehaviour() == behavior.New)                        
                            oNode.AgregarNodo(txtDescripcion.Text, null, null);                        
                    break;
            }

            lblRuta.Text = MostrarRuta(oNode);
            txtDescripcion.Enabled = false;
            btnSelVendedor.Enabled = false;
            txtVendedor.Enabled = false;
            btnEditar.Enabled = true;
            btnNuevo.Enabled = true;
            btnEliminar.Enabled = true;
            btnGuardar.Enabled = false;
            btnCancelarGuardar.Enabled = false;

            tvDivisiones_SelectedNodeChanged(null, new EventArgs());
            HabilitarControles(true, botComandos.Controls);
            SetFormBehaviour(behavior.View);
        }

        protected void btnEliminar_Click(object sender, EventArgs e)
        {
            DivisionNode oNode = (DivisionNode)tvDivisiones.SelectedNode;
            switch (oNode.TipoNodo)
            {
                case TipoNodo.Raiz:
                    break;
                case TipoNodo.Division:
                case TipoNodo.Zona:
                case TipoNodo.Area:                    
                    oNode.QuitarNodo();                    
                    break;
            }
            lblRuta.Text = string.Empty;       
            txtDescripcion.Enabled = false;
            txtDescripcion.Text = string.Empty;
            btnSelVendedor.Enabled = false;
            txtVendedor.Enabled = false;
            btnEditar.Enabled = false;
            btnEliminar.Enabled = false;
            btnGuardar.Enabled = false;
            btnCancelarGuardar.Enabled = false;
        }

        protected void btnNuevo_Click(object sender, EventArgs e)
        {
            btnNuevo.Enabled = false;
            btnEliminar.Enabled = false;
            btnEditar.Enabled = false;
            btnGuardar.Enabled = true;
            btnCancelarGuardar.Enabled = true;
            txtDescripcion.Enabled = true;

            DivisionNode oNode = (DivisionNode)tvDivisiones.SelectedNode;
            switch ((oNode).TipoNodo)
            {
                case TipoNodo.Raiz:
                    divVendedor.Visible = false;
                    break;

                case TipoNodo.Division:
                    divVendedor.Visible = true;
                    break;

                case TipoNodo.Zona:
                    divVendedor.Visible = false;
                    break;

                case TipoNodo.Area:
                    divVendedor.Visible = false;
                    break;
            }
            
            if (divVendedor.Visible)
            {
                txtVendedor.Enabled = true;
                btnSelVendedor.Enabled = true;
                txtVendedor.Text = string.Empty;
                hidIdVendedor.Value = string.Empty;
            }
            txtDescripcion.Text = string.Empty;
            HabilitarControles(false, botComandos.Controls);

            SetFormBehaviour(behavior.New);
        }

        protected void btnEditar_Click(object sender, EventArgs e)
        {
            btnNuevo.Enabled = false;
            btnEliminar.Enabled = false;
            btnEditar.Enabled = false;
            btnGuardar.Enabled = true;
            btnCancelarGuardar.Enabled = true;
            txtDescripcion.Enabled = true;
            if (divVendedor.Visible)
            {
                txtVendedor.Enabled = true;
                btnSelVendedor.Enabled = true;
            }

            HabilitarControles(false, botComandos.Controls);

            SetFormBehaviour(behavior.Edit);
        }

        protected void btnCancelarGuardar_Click(object sender, EventArgs e)
        {
            btnNuevo.Enabled = false;
            btnEliminar.Enabled = false;
            btnEditar.Enabled = false;
            btnGuardar.Enabled = false;
            btnCancelarGuardar.Enabled = false;
            txtDescripcion.Enabled = false;
            if (divVendedor.Visible)
            {
                txtVendedor.Enabled = false;
                btnSelVendedor.Enabled = false;
            }

            HabilitarControles(true, botComandos.Controls);

            SetFormBehaviour(behavior.Initial);
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                EjecutarComandosBackEnd((DivisionNode)tvDivisiones.Nodes[0]);
                CargarDivisiones();
                MostrarMensaje("Divisiones actualizadas correctamente");
            }
            catch (BLLException bllEx)
            {
                MostrarMensaje(bllEx.Message);
            }
            catch (Exception)
            {
                throw;
            }
        }


        private void EjecutarComandosBackEnd(DivisionNode pNode)
        {
            switch (pNode.TipoNodo)
            {
                case TipoNodo.Raiz:
                    foreach (DivisionNode oSubNode in pNode.ChildNodes)
                    {
                        EjecutarComandosBackEnd(oSubNode);
                    }
                    break;

                case TipoNodo.Division:
                    DivisionBE oDivisionBE = (DivisionBE)pNode.Elemento;
                    switch (pNode.AccionNodo)
                    {
                        case AccionNodo.Crear:                            
                            DivisionBLL.Insertar(oDivisionBE);                            
                            break;
                        case AccionNodo.Editar:
                            DivisionBLL.Modificar(oDivisionBE);
                            break;
                        case AccionNodo.Eliminar:
                            DivisionBLL.Delete(oDivisionBE.IdDivision);
                            pNode.AccionNodo = AccionNodo.Ninguna;
                            return;
                    }
                    pNode.AccionNodo = AccionNodo.Ninguna;
                    foreach (DivisionNode oSubNode in pNode.ChildNodes)
                    {
                        (oSubNode.Elemento as ZonasBE).IdDivision = oDivisionBE.IdDivision;
                        EjecutarComandosBackEnd(oSubNode);
                    }
                    break;

                case TipoNodo.Zona:
                    ZonasBE oZonaBE = (ZonasBE)pNode.Elemento;
                    switch (pNode.AccionNodo)
                    {
                        case AccionNodo.Crear:                            
                            ZonaBLL.Insertar(oZonaBE);                            
                            break;
                        case AccionNodo.Editar:
                            ZonaBLL.Modificar(oZonaBE);                            
                            break;
                        case AccionNodo.Eliminar:
                            ZonaBLL.Delete(oZonaBE.IdZona.Value);
                            pNode.AccionNodo = AccionNodo.Ninguna;
                            return;
                    }
                    pNode.AccionNodo = AccionNodo.Ninguna;
                    foreach (DivisionNode oSubNode in pNode.ChildNodes)
                    {
                        (oSubNode.Elemento as AreaBE).IdZona = oZonaBE.IdZona;
                        EjecutarComandosBackEnd(oSubNode);
                    }

                    break;

                case TipoNodo.Area:
                    AreaBE oAreaBE = (AreaBE)pNode.Elemento;
                    switch (pNode.AccionNodo)
                    {
                        case AccionNodo.Crear:                            
                            AreaBLL.Insertar(oAreaBE);                            
                            break;
                        case AccionNodo.Editar:
                            AreaBLL.Modificar(oAreaBE);                            
                            break;
                        case AccionNodo.Eliminar:
                            AreaBLL.Delete(oAreaBE.IdArea.Value);
                            pNode.AccionNodo = AccionNodo.Ninguna;
                            return;
                    }
                    pNode.AccionNodo = AccionNodo.Ninguna;
                    break;
            }

        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            CargarDivisiones();
            SetFormBehaviour(behavior.Initial);
            divVendedor.Visible = false;

        }

    }
}